﻿using System.Collections.Generic;
using GameFramework.skill;

namespace GameFramework.buff
{
    public interface IBuff
    {
        //===================================buff自己的生命周期事件=============================
        //加入buff容器前
        bool OnBuffBeforeAdd(List<BaseBuff> ownerAllBuffs);
        //同类型buff刷新
        BaseBuff OnBuffRefresh(List<BaseBuff> ownerAllBuffs);
        //加入buff到容器后
        void OnBuffAfterAdd(List<BaseBuff> ownerAllBuffs);
        
        //间隔触发,goneTime，出发时距离开始计算的时间，times:第几次触发
        void OnIntervalTrigger(List<BaseBuff> ownerAllBuffs);
        //buff被销毁前(还未移除buff容器)
        void OnBuffBeforeDestroy(List<BaseBuff> ownerAllBuffs);
        //buff被销毁后(已经移除buff容器)
        void OnBuffAfterDestroy(List<BaseBuff> ownerAllBuffs);
        //===================================buff监听其他事件=============================
        //监听技能释放成功，常用于被动技能Buff，比如说角色施法时有10%概率获得30%的攻速提升。那么我们通常是Buff-A监听OnAbilityExcuted事件，
        //然后10%概率添加Buff-B。Buff-B的作用是修改玩家属性，增加30%攻速。
        void onSkillExcute(Skill skill);

        //监听我方给目标造成伤害时触发
        //比如说对目标造成的伤害有10%概率无法被闪避，那么这个效果我们就可以通过监听OnBeforeGiveDamage的流程来实现。
        //当执行伤害流程时，在计算伤害前我们抛出一个事件event。event里面有当前伤害数据。Buff在调用OnBeforeGiveDamage(event)时，
        //修改event.Damage.DamageFlag |= DamageFlag_NotMiss，标注该伤害无法被闪避就行了。
        //又或者如果有一个需求是给目标造成伤害后有10%几率触发DOT伤害效果，那么我们在OnAfterGiveDamage的时候取出event.Target并给这个目标加个DOT类Buff即可
        void OnBeforeGiveDamage();
        void OnAfterGiveDamage();
        
        //监听我方受到伤害时触发
        //如护盾类Buff通常在OnBeforeTakeDamage的时候修改伤害数据。又或者有某些Buff在受到伤害后可以触发各类效果就可以通过监听OnAfterTakeDamage事件来触发指定逻辑。
        void OnBeforeTakeDamage();
        void OnAfterTakeDamage();
        //监听我方死亡时触发
        //如免疫致死效果可以通过监听OnBeforeDead事件修改角色当前的Hp>0，从而让角色提前退出死亡流程以避免死亡。
        //死亡后触发额外效果，如爆炸或者召唤其他生物都可以通过监听OnAfterDead事件来执行。
        void OnBeforeDead();
        void OnAfterDead();
        //监听我方击杀目标时触发。
        //如当击杀目标后获得治疗效果回复即可通过监听到Kill事件时给自己加一个HOT的Buff来实现
        void OnKill();
    }
}